package com.wjm;

import com.wjm.until.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * Data:2022年09月08日
 * Author:wjm
 * Content:  JDBC操作事务
 *
 *      Connection接口中与事务有关的方法
 *          void setAutoCommit(boolean autoCommit)
 *              如果值为false，表示关闭自动提交，相当于开启事务。
 *          void commit()
 *              提交事务
 *          void rollback()
 *              回滚事务
 *
 *      开发步骤：
 *          1) 获取连接
 *          2) 开启事务
 *          3) 获取到 PreparedStatement 对象
 *          4) 使用 PreparedStatement 执行两次更新操作 [转账过程]
 *          5) 正常情况下提交事务
 *          6) 出现异常回滚事务
 *          7) 最后关闭资源
 *
 *      案例：模拟转账
 *
 */
public class JdbcAutoCommit {
    public static void main(String[] args) {
        Connection connection = null;
        try{
            connection= JdbcUtil.getConnection();

            //开启事务
            connection.setAutoCommit(false);

            //小李子转账的sql
            String sql1 = "update person1 set count=count-? where name =? ;";

            //创建语句对象
            PreparedStatement preparedStatement1 = connection.prepareStatement(sql1);

            //赋值
            preparedStatement1.setInt(1,500);
            preparedStatement1.setString(2,"小李子");

            //执行语句
            int row1 = preparedStatement1.executeUpdate();
            System.out.println(row1);

            //判断是否执行成功
            if (row1 == 1){
                System.out.println("扣款成功");
            }

            //王五收款的sql
            String sql2 = "update person1 set count=count+? where name =? ;";

            //创建语句对象
            PreparedStatement preparedStatement2 = connection.prepareStatement(sql2);

            //赋值
            preparedStatement2.setInt(1,500);
            preparedStatement2.setString(2,"王五");

            //执行语句
            int row2 = preparedStatement2.executeUpdate();
            System.out.println(row2);

            //判断是否执行成功
            if (row2 > 0){
                System.out.println("收款成功");
            }

            //提交事务
            connection.commit();


        } catch (Exception e) {
            e.printStackTrace();
            //如果执行sql语句出现了异常，则进行事务的回滚
            try {
                connection.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }finally {
            //关闭连接
            JdbcUtil.close(connection);
        }


    }
}
